package com.leo.common;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.util.Duration;

/**
 * @author wangss
 * @date 2023/03/14 18:54
 * @description
 **/
public class CustomTextFieldTreeCell extends TreeCell<String> {

    private static final String FRIEND_LIST = "好友列表";
    private static final String NEW_MAIL = "new Email";

    private TextField textField = new TextField();
    private ContextMenu contextMenu = new ContextMenu();
    private ContextMenu delContextMenu = new ContextMenu();

    public CustomTextFieldTreeCell() {
        MenuItem addItem = new MenuItem("添加好友邮箱");
        contextMenu.getItems().add(addItem);
        addItem.setOnAction(event -> {
            TreeItem newItem = new TreeItem(NEW_MAIL);
            getTreeItem().getChildren().add(newItem);
            getTreeItem().setExpanded(true);
        });

        MenuItem delItem = new MenuItem("删除");
        delContextMenu.getItems().add(delItem);
        delItem.setOnAction(event -> {
            // TODO 从库里删除

            /**
             * 删除这里有一个bug，比如总共有5行数据，删除第4行，原来的第5行会移动到第4行（这时第4行展示的值和userdata的值不同），因为userdata还是沿用的原来第4行的值
             * 这时候虽然第5行没有了，但是第5行仍然保留了 右键删除功能（和userdata值），这时如果新增邮件好友，则会自带右键删除功能，这是有问题的
             * 这种情况通过设计应该可以避免，暂时先这样
             */
            getTreeItem().getParent().getChildren().remove(getTreeItem());
        });

        // 添加按键监听
        textField.setOnKeyReleased(event -> {
            if (KeyCode.ENTER == event.getCode()) {
                commitEdit(textField.getText());
            } else if (KeyCode.ESCAPE == event.getCode()) {
                cancelEdit();
            }
        });
    }

    /**
     * 开始编辑
     */
    @Override
    public void startEdit() {
        // 如果userdata不等于空，说明已经编辑过一次，那么就不能再次编辑了
        if (null != getUserData()) {
            return;
        }
        super.startEdit();
        // 设置treeitem的文本值为空
        setText(null);
        // 设置文本框的值
        textField.setText(getItem());
        setGraphic(textField);
        textField.selectAll();
        textField.requestFocus();
    }

    /**
     * 编辑完成
     *
     * @param newValue
     */
    @Override
    public void commitEdit(String newValue) {
        textField.setStyle("-fx-text-fill: black");
        // 判断邮箱格式
        if (!newValue.contains("@")) {
            textField.setStyle("-fx-text-fill: red");
            Timeline timeline = new Timeline();
            KeyFrame hidden = new KeyFrame(Duration.millis(0), event -> textField.setText(""));
            KeyFrame show = new KeyFrame(Duration.millis(500), event -> textField.setText(newValue));
            timeline.getKeyFrames().addAll(hidden, show);
            timeline.setAutoReverse(true);
            timeline.setCycleCount(3);
            timeline.play();
            return;
        }

        // TODO 判断是否已经存在

        // TODO 入库

        super.commitEdit(newValue);

        // 设置删除菜单，设置userdata防止再次编辑
        setUserData(newValue);
        setContextMenu(delContextMenu);
    }

    /**
     * 取消编辑
     */
    @Override
    public void cancelEdit() {
        super.cancelEdit();
        setText(getItem());
        setGraphic(null);
    }

    /**
     * 更新列表，有变动就会遍历列表进行更新
     *
     * @param item
     * @param empty
     */
    @Override
    protected void updateItem(String item, boolean empty) {
        setGraphic(null);
        setUserData(null);
        setContextMenu(null);
        setText(null);

        if (empty) {
            return;
        }

        super.updateItem(item, empty);

        setText(item);

        // 如果是好友列表，则设置添加功能
        if (FRIEND_LIST.equals(item)) {
            setContextMenu(contextMenu);
        }

        if (!NEW_MAIL.equals(item)) {
            setUserData(item);
            if (null != getTreeItem().getParent() && null == getContextMenu() && FRIEND_LIST.equals(getTreeItem().getParent().getValue())) {
                setContextMenu(delContextMenu);
            }
        }
    }
}
